{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 查看FashionMNIST原始数据格式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-30T02:47:52.085269Z",
     "start_time": "2025-06-30T02:47:52.081760Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['c:\\\\Program Files\\\\Python312\\\\python312.zip', 'c:\\\\Program Files\\\\Python312\\\\DLLs', 'c:\\\\Program Files\\\\Python312\\\\Lib', 'c:\\\\Program Files\\\\Python312', '', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\Pythonwin', 'c:\\\\Program Files\\\\Python312\\\\Lib\\\\site-packages', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\setuptools\\\\_vendor']\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-30T02:47:54.607816Z",
     "start_time": "2025-06-30T02:47:52.085269Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(<PIL.Image.Image image mode=L size=28x28 at 0x21B0B6B0320>, 9)\n"
     ]
    },
    {
     "data": {
      "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/wAALCAAcABwBAREA/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/9oACAEBAAA/APn+tbw1oNx4m8QWmkWx2yXD4LkZCADJJ+gFbviL4a63oc7COE3MW4hdn38duD976jNc9daDqllIsc9lKrMu4YGeMkdR7gj8KzcV7H8BtEvV16+1iWCeG1Wz8mOV02pIzupwCeuAp6Z98cZ90aIzLIlw0c0ZJ4KgjHoeOa+evjS9n/wnMcNxBPCYLKONFhA2FNzMpGenDcgd816V4K03wefC+m3NlpVhP+5QSXBiR5fMx825iMg5zwce3FdbOzTwgW90lu6uCm8eYrL02soIyCPQgggEdMGQ3cluiPNK0rJwrRQBNueuMkt+teNfGKxsdY8WWdxNqcNo66eieXMwVsb5DnH415Hp2rajpE5n02/urOUjBe3laMkehIPIrVm8eeLrhNknibVivoLtx/I1UPinxC3XXtUP1vJP8ay5JZJpGkldnduSzHJP41//2Q==",
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAABwAAAAcCAAAAABXZoBIAAACS0lEQVR4AWKgA2BkYOD1ZGBgZAHZxcjIAKZBbBBm+quS8v3rj1N/GBiZGP8wMKNIMv91cnnCzuU65+X/vww8/76hSP5iMFVgZtpp2HXm8nUz02PHGUHGQTHjf9cugd//GE7f+cUo8ft0yDSEJCMDw/8TCgyMf34x/Ph3/vYfT0VphLH/GRgY3kt+Z2fl+cH5z8aSSWwHqmsZuJiZvn18p/CPkYnr7z9ZBiaofQwMjMwMPFI/frH++sr/j537K9sldhOE5H9mhnBJJg4Gbtlf7L//cQhvusaCkGT5xXDlBxsXl6rSD2Yunr9PoraeYAGZx8T4+x/DHwaGbV+/s/1/zczxm+H3P2a9jwxMDMz///z6+Y+BwW7ime9v//z78/XrXw6GbwxsX4NAYc3AICSlJhmk/oPpN+czVjbhX1zHeOz+fWR9qcnIYNkkKvCX+cMfrl+M36+HneEVVGC4x/v5GycPHxcj83GpP3+/MTB/Z2DgF0lwy3z24/49VeFfrLxsf+UBY0xqv8vDw87Ayv/4mSiTRACHIrexMdMvJjYGRlYLlpeP+X485mHje/eQ5/uPP+svKwj9+vD77y/Wf4xsaixP/z/mFvnw5jULOysHL9Mbza+P37O/+f3nN6fERwOWC+sTn937wcPGwcb88+//by/+/WX5wfPrw4fffxRfMjIweBWLv/7wl5mNhZnxPysrGysjA+NLBrZ/EpfCGJn+MTA4tYnxMzGz/GV8+f/pvy/MDP9/f2Paff0YJBAYGBg0RN/LPPx1Fx5HFDIAaCTYdiCc4RIAAAAASUVORK5CYII=",
      "text/plain": [
       "<PIL.Image.Image image mode=L size=28x28>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from torchvision import datasets, transforms\n",
    "from deeplearning_func import EarlyStopping, ModelSaver,train_classification_model,plot_learning_curves\n",
    "from deeplearning_func import evaluate_classification_model as evaluate_model\n",
    "# 加载Fashion MNIST数据集，张量就是和numpy数组一样\n",
    "transform = transforms.Compose([])\n",
    "train_dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=transform)\n",
    "test_dataset = datasets.FashionMNIST(root='./data', train=False, download=True, transform=transform)\n",
    "print(train_dataset[0])\n",
    "train_dataset[0][0]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 加载数据并处理为tensor"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-30T02:47:54.638950Z",
     "start_time": "2025-06-30T02:47:54.607816Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集形状: (60000, 28, 28)\n",
      "训练集标签数量: 60000\n",
      "测试集形状: (10000, 28, 28)\n",
      "测试集标签数量: 10000\n"
     ]
    }
   ],
   "source": [
    "# 加载Fashion MNIST数据集，张量就是和numpy数组一样\n",
    "\n",
    "train_dataset = datasets.FashionMNIST(root='./data', train=True, download=True, transform=transforms.ToTensor())\n",
    "test_dataset = datasets.FashionMNIST(root='./data', train=False, download=True, transform=transforms.ToTensor())\n",
    "\n",
    "# 获取图像和标签\n",
    "# 注意：由于使用了transform，图像已经被转换为张量且标准化\n",
    "# 我们需要从dataset中提取原始图像用于显示\n",
    "train_images = train_dataset.data.numpy()\n",
    "train_labels = train_dataset.targets.numpy()\n",
    "test_images = test_dataset.data.numpy()\n",
    "test_labels = test_dataset.targets.numpy()\n",
    "\n",
    "# 定义类别名称\n",
    "class_names = ['T-shirt/top', '裤子', '套头衫', '连衣裙', '外套',\n",
    "               '凉鞋', '衬衫', '运动鞋', '包', '短靴']\n",
    "\n",
    "# 查看数据集基本信息\n",
    "print(f\"训练集形状: {train_images.shape}\")\n",
    "print(f\"训练集标签数量: {len(train_labels)}\")\n",
    "print(f\"测试集形状: {test_images.shape}\")\n",
    "print(f\"测试集标签数量: {len(test_labels)}\")\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 把数据集划分为训练集55000和验证集5000，并给DataLoader"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-30T02:47:54.643977Z",
     "start_time": "2025-06-30T02:47:54.639461Z"
    }
   },
   "outputs": [],
   "source": [
    "# 从训练集中划分出验证集\n",
    "train_size = 55000\n",
    "val_size = 5000\n",
    "# 设置随机种子以确保每次得到相同的随机划分结果\n",
    "generator = torch.Generator().manual_seed(42)\n",
    "train_subset, val_subset = torch.utils.data.random_split(\n",
    "    train_dataset, \n",
    "    [train_size, val_size],\n",
    "    generator=generator #设置随机种子，确保每次得到相同的随机划分结果\n",
    ")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-30T02:48:10.867590Z",
     "start_time": "2025-06-30T02:48:09.235191Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([55000, 1, 28, 28])\n",
      "训练数据集均值: 0.2856\n",
      "训练数据集标准差: 0.3527\n",
      "数据集中图像总数: 55000\n"
     ]
    }
   ],
   "source": [
    "def calculate_mean_std(train_dataset):\n",
    "    # 首先将所有图像数据堆叠为一个大张量\n",
    "    all_images = torch.stack([img_tensor for img_tensor, _ in train_dataset])\n",
    "    print(all_images.shape)\n",
    "    # 计算通道维度上的均值和标准差\n",
    "    # Fashion MNIST是灰度图像，只有一个通道\n",
    "    # 对所有像素值计算均值和标准差\n",
    "    mean = torch.mean(all_images)\n",
    "    std = torch.std(all_images)\n",
    "\n",
    "    print(f\"训练数据集均值: {mean.item():.4f}\")\n",
    "    print(f\"训练数据集标准差: {std.item():.4f}\")\n",
    "\n",
    "    # 检查数据集大小\n",
    "    print(f\"数据集中图像总数: {len(train_dataset)}\")\n",
    "calculate_mean_std(train_subset)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集大小: 55000\n",
      "验证集大小: 5000\n",
      "测试集大小: 10000\n",
      "批次大小: 64\n",
      "训练批次数: 860\n"
     ]
    }
   ],
   "source": [
    "# 创建数据加载器\n",
    "batch_size = 64\n",
    "train_loader = torch.utils.data.DataLoader(\n",
    "    train_subset,\n",
    "    batch_size=batch_size,\n",
    "    shuffle=True #打乱数据集，每次迭代时，数据集的顺序都会被打乱\n",
    ")\n",
    "\n",
    "val_loader = torch.utils.data.DataLoader(\n",
    "    val_subset,\n",
    "    batch_size=batch_size,\n",
    "    shuffle=False\n",
    ")\n",
    "\n",
    "test_loader = torch.utils.data.DataLoader(\n",
    "    test_dataset,\n",
    "    batch_size=batch_size,\n",
    "    shuffle=False\n",
    ")\n",
    "\n",
    "# 打印数据集大小信息\n",
    "print(f\"训练集大小: {len(train_subset)}\")\n",
    "print(f\"验证集大小: {len(val_subset)}\")\n",
    "print(f\"测试集大小: {len(test_dataset)}\")\n",
    "print(f\"批次大小: {batch_size}\")\n",
    "print(f\"训练批次数: {len(train_loader)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:33.148120Z",
     "start_time": "2025-06-26T01:43:33.145230Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "55040"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "64*860"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 搭建模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([20, 100])\n"
     ]
    }
   ],
   "source": [
    "#理解每个接口的方法，单独写例子\n",
    "import torch.nn as nn\n",
    "m=nn.BatchNorm1d(100)\n",
    "x=torch.randn(20,100)\n",
    "print(m(x).shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:33.152657Z",
     "start_time": "2025-06-26T01:43:33.148120Z"
    }
   },
   "outputs": [],
   "source": [
    "import torch.nn as nn\n",
    "import torch.nn.functional as F\n",
    "\n",
    "class NeuralNetwork(nn.Module):\n",
    "    def __init__(self):\n",
    "        super().__init__()\n",
    "        #normalize\n",
    "        self.transform = nn.Sequential(\n",
    "            transforms.Normalize([0.2856], [0.3527])\n",
    "        )\n",
    "\n",
    "        # 第一组卷积层 - 32个卷积核\n",
    "        self.conv1 = nn.Conv2d(1, 32, kernel_size=3, padding=1) # 输入通道数，输出通道数代表的是卷积核的个数\n",
    "        self.conv2 = nn.Conv2d(32, 32, kernel_size=3, padding=1)\n",
    "        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)\n",
    "        \n",
    "        # 第二组卷积层 - 64个卷积核\n",
    "        self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1)\n",
    "        self.conv4 = nn.Conv2d(64, 64, kernel_size=3, padding=1)\n",
    "\n",
    "        \n",
    "        # 第三组卷积层 - 128个卷积核\n",
    "        self.conv5 = nn.Conv2d(64, 128, kernel_size=3, padding=1)\n",
    "        self.conv6 = nn.Conv2d(128, 128, kernel_size=3, padding=1)\n",
    "\n",
    "        \n",
    "        # 计算全连接层的输入特征数\n",
    "        # 经过3次池化，图像尺寸从28x28变为3x3x128\n",
    "        self.fc1 = nn.Linear(128 * 3 * 3, 256)\n",
    "        self.fc2 = nn.Linear(256, 10)\n",
    "        \n",
    "        # 初始化权重\n",
    "        self.init_weights()\n",
    "        \n",
    "    def init_weights(self):\n",
    "        \"\"\"使用 xavier 均匀分布来初始化卷积层和全连接层的权重\"\"\"\n",
    "        for m in self.modules():\n",
    "            if isinstance(m, nn.Conv2d) or isinstance(m, nn.Linear):\n",
    "                nn.init.xavier_uniform_(m.weight)\n",
    "                if m.bias is not None:\n",
    "                    nn.init.zeros_(m.bias)\n",
    "    \n",
    "    def forward(self, x):\n",
    "        # x.shape [batch size, 1, 28, 28]\n",
    "        x=self.transform(x)\n",
    "        # 第一组卷积层\n",
    "        x = F.selu(self.conv1(x))\n",
    "        # print(f\"conv1后的形状: {x.shape}\")\n",
    "        x = F.selu(self.conv2(x))\n",
    "        # print(f\"conv2后的形状: {x.shape}\")\n",
    "        x = self.pool(x)\n",
    "        # print(f\"pool1后的形状: {x.shape}\")\n",
    "        \n",
    "        # 第二组卷积层\n",
    "        x = F.selu(self.conv3(x))\n",
    "        # print(f\"conv3后的形状: {x.shape}\")\n",
    "        x = F.selu(self.conv4(x))\n",
    "        # print(f\"conv4后的形状: {x.shape}\")\n",
    "        x = self.pool(x)\n",
    "        # print(f\"pool2后的形状: {x.shape}\")\n",
    "        \n",
    "        # 第三组卷积层\n",
    "        x = F.selu(self.conv5(x))\n",
    "        # print(f\"conv5后的形状: {x.shape}\")\n",
    "        x = F.selu(self.conv6(x))\n",
    "        # print(f\"conv6后的形状: {x.shape}\")\n",
    "        x = self.pool(x)\n",
    "        # print(f\"pool3后的形状: {x.shape}\")\n",
    "        \n",
    "        # 展平\n",
    "        x = x.view(x.size(0), -1)\n",
    "        # print(f\"展平后的形状: {x.shape}\")\n",
    "        \n",
    "        # 全连接层\n",
    "        x = F.selu(self.fc1(x))\n",
    "        # print(f\"fc1后的形状: {x.shape}\")\n",
    "        x = self.fc2(x)\n",
    "        # print(f\"fc2后的形状: {x.shape}\")\n",
    "        \n",
    "        return x\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:33.185031Z",
     "start_time": "2025-06-26T01:43:33.152657Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "批次图像形状: torch.Size([64, 1, 28, 28])\n",
      "批次标签形状: torch.Size([64])\n",
      "----------------------------------------------------------------------------------------------------\n",
      "torch.Size([64, 10])\n"
     ]
    }
   ],
   "source": [
    "# 实例化模型\n",
    "model = NeuralNetwork()\n",
    "\n",
    "# 从train_loader获取第一个批次的数据\n",
    "dataiter = iter(train_loader)\n",
    "images, labels = next(dataiter)\n",
    "\n",
    "# 查看批次数据的形状\n",
    "print(\"批次图像形状:\", images.shape)\n",
    "print(\"批次标签形状:\", labels.shape)\n",
    "\n",
    "\n",
    "print('-'*100)\n",
    "# 进行前向传播\n",
    "with torch.no_grad():  # 不需要计算梯度\n",
    "    outputs = model(images)\n",
    "    \n",
    "\n",
    "print(outputs.shape)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:33.203053Z",
     "start_time": "2025-06-26T01:43:33.199532Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "需要求梯度的参数总量: 584170\n",
      "模型总参数量: 584170\n",
      "\n",
      "各层参数量明细:\n",
      "conv1.weight: 288 参数\n",
      "conv1.bias: 32 参数\n",
      "conv2.weight: 9216 参数\n",
      "conv2.bias: 32 参数\n",
      "conv3.weight: 18432 参数\n",
      "conv3.bias: 64 参数\n",
      "conv4.weight: 36864 参数\n",
      "conv4.bias: 64 参数\n",
      "conv5.weight: 73728 参数\n",
      "conv5.bias: 128 参数\n",
      "conv6.weight: 147456 参数\n",
      "conv6.bias: 128 参数\n",
      "fc1.weight: 294912 参数\n",
      "fc1.bias: 256 参数\n",
      "fc2.weight: 2560 参数\n",
      "fc2.bias: 10 参数\n"
     ]
    }
   ],
   "source": [
    "# 计算模型的总参数量\n",
    "# 统计需要求梯度的参数总量\n",
    "total_params = sum(p.numel() for p in model.parameters() if p.requires_grad)\n",
    "print(f\"需要求梯度的参数总量: {total_params}\")\n",
    "\n",
    "# 统计所有参数总量\n",
    "all_params = sum(p.numel() for p in model.parameters())\n",
    "print(f\"模型总参数量: {all_params}\")\n",
    "\n",
    "# 查看每层参数量明细\n",
    "print(\"\\n各层参数量明细:\")\n",
    "for name, param in model.named_parameters():\n",
    "    print(f\"{name}: {param.numel()} 参数\")\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "294912"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "128*3*3*256"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 各层参数量明细:\n",
    "conv1.weight: 288 参数 3*3*1*32\n",
    "conv1.bias: 32 参数\n",
    "conv2.weight: 9216 参数 3*3*32*32\n",
    "conv2.bias: 32 参数  \n",
    "conv3.weight: 18432 参数 3*3*32*64\n",
    "conv3.bias: 64 参数\n",
    "conv4.weight: 36864 参数  3*3*64*64\n",
    "conv4.bias: 64 参数\n",
    "conv5.weight: 73728 参数\n",
    "conv5.bias: 128 参数\n",
    "conv6.weight: 147456 参数\n",
    "conv6.bias: 128 参数\n",
    "fc1.weight: 294912 参数 128*3*3*256\n",
    "fc1.bias: 256 参数\n",
    "fc2.weight: 2560 参数\n",
    "fc2.bias: 10 参数"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:33.217395Z",
     "start_time": "2025-06-26T01:43:33.203561Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "OrderedDict([('conv1.weight',\n",
       "              tensor([[[[-0.0099, -0.0911, -0.0808],\n",
       "                        [ 0.0518,  0.0939, -0.0008],\n",
       "                        [-0.0281,  0.1327, -0.0298]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.1108,  0.0499, -0.1034],\n",
       "                        [ 0.0042,  0.0670,  0.1060],\n",
       "                        [ 0.0180, -0.0636, -0.1203]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0262, -0.1017,  0.0853],\n",
       "                        [-0.0567, -0.0669, -0.0808],\n",
       "                        [ 0.0634, -0.1024,  0.1251]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0011,  0.0858, -0.1183],\n",
       "                        [ 0.1161,  0.0453, -0.1143],\n",
       "                        [-0.1072, -0.0525,  0.1325]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0677, -0.0961, -0.0584],\n",
       "                        [-0.0242,  0.0751,  0.1146],\n",
       "                        [-0.1278, -0.1271, -0.0022]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.1165,  0.0618, -0.0429],\n",
       "                        [-0.0550,  0.1352, -0.1279],\n",
       "                        [-0.1360,  0.0278,  0.0991]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.1410, -0.0016, -0.0885],\n",
       "                        [ 0.0498, -0.0876, -0.0312],\n",
       "                        [-0.1177,  0.0904,  0.0013]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.1181,  0.1275,  0.1107],\n",
       "                        [ 0.0380,  0.0577,  0.0336],\n",
       "                        [ 0.0048, -0.0952,  0.0165]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0404,  0.0037, -0.1194],\n",
       "                        [-0.0140, -0.1152, -0.0281],\n",
       "                        [-0.1129, -0.0158, -0.0042]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0051,  0.1177,  0.0712],\n",
       "                        [-0.0683,  0.1073,  0.1249],\n",
       "                        [ 0.1264, -0.0603, -0.1047]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0796, -0.0613,  0.0730],\n",
       "                        [ 0.1318, -0.0785,  0.1129],\n",
       "                        [-0.1042, -0.1187, -0.1380]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0027, -0.0035,  0.0586],\n",
       "                        [-0.0643,  0.0709, -0.1408],\n",
       "                        [ 0.0771, -0.0768,  0.1110]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0678,  0.0383,  0.0286],\n",
       "                        [-0.0700,  0.0868, -0.0665],\n",
       "                        [ 0.1158,  0.0043,  0.1257]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.1045, -0.0360, -0.0848],\n",
       "                        [-0.0902,  0.0847, -0.0589],\n",
       "                        [-0.0195, -0.1411,  0.0747]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0945,  0.0468,  0.1151],\n",
       "                        [ 0.0363, -0.0286, -0.0822],\n",
       "                        [-0.0579, -0.0482,  0.1199]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0025, -0.0805, -0.0894],\n",
       "                        [ 0.0584,  0.0524,  0.0716],\n",
       "                        [ 0.0700,  0.0071,  0.0354]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0005,  0.1054,  0.0065],\n",
       "                        [ 0.0961, -0.0676,  0.1278],\n",
       "                        [ 0.0024, -0.0889, -0.0688]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0536,  0.1285, -0.0667],\n",
       "                        [-0.1205, -0.0836, -0.0347],\n",
       "                        [ 0.1226, -0.1402, -0.0585]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0580,  0.0964,  0.0825],\n",
       "                        [-0.0554,  0.0942, -0.1370],\n",
       "                        [-0.1303, -0.0401,  0.0135]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0569,  0.0956,  0.0431],\n",
       "                        [ 0.0212, -0.1369,  0.0197],\n",
       "                        [-0.0711,  0.1149, -0.0112]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0348,  0.0742,  0.0178],\n",
       "                        [ 0.1265, -0.1406,  0.0777],\n",
       "                        [ 0.0589, -0.0638, -0.0750]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0041,  0.0945,  0.0928],\n",
       "                        [-0.1039,  0.1180,  0.1188],\n",
       "                        [ 0.0251, -0.1415, -0.1071]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.1113,  0.1199,  0.0419],\n",
       "                        [ 0.0912, -0.1156,  0.0386],\n",
       "                        [-0.0652, -0.0520, -0.1192]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0212, -0.0869,  0.0708],\n",
       "                        [ 0.1263,  0.0867, -0.1413],\n",
       "                        [ 0.0413,  0.0828,  0.0984]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.1341,  0.0352,  0.0542],\n",
       "                        [-0.0041,  0.0307,  0.1375],\n",
       "                        [ 0.0883, -0.0512,  0.1062]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0749, -0.0533,  0.1309],\n",
       "                        [ 0.0185, -0.0644, -0.0122],\n",
       "                        [-0.0763,  0.0540,  0.0031]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0928, -0.0856, -0.1248],\n",
       "                        [-0.0091, -0.0109, -0.0069],\n",
       "                        [-0.0855, -0.1418,  0.0454]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.1200, -0.1187, -0.0950],\n",
       "                        [-0.1255,  0.0513, -0.0437],\n",
       "                        [-0.0639,  0.0011, -0.0679]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0258,  0.0397,  0.0137],\n",
       "                        [-0.0196, -0.0447,  0.0215],\n",
       "                        [-0.0416,  0.0654, -0.0320]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.1100, -0.0064, -0.0572],\n",
       "                        [-0.0406, -0.0954, -0.0885],\n",
       "                        [-0.0233, -0.1221,  0.1168]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0935, -0.1406, -0.0849],\n",
       "                        [-0.1235, -0.0417, -0.0299],\n",
       "                        [ 0.0933,  0.1109, -0.0384]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0246, -0.0116, -0.0876],\n",
       "                        [ 0.1083, -0.0243, -0.1391],\n",
       "                        [ 0.1168, -0.0679, -0.0035]]]])),\n",
       "             ('conv1.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('conv2.weight',\n",
       "              tensor([[[[-0.0614, -0.0336,  0.0209],\n",
       "                        [-0.0132, -0.0930, -0.0731],\n",
       "                        [-0.0353,  0.0787,  0.0729]],\n",
       "              \n",
       "                       [[ 0.0121, -0.0125,  0.0534],\n",
       "                        [ 0.0542,  0.0317,  0.0980],\n",
       "                        [-0.0620, -0.0508,  0.0996]],\n",
       "              \n",
       "                       [[ 0.0822, -0.0926,  0.0154],\n",
       "                        [-0.0526, -0.0166, -0.0817],\n",
       "                        [ 0.0928,  0.0155, -0.0844]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0034, -0.0755,  0.0010],\n",
       "                        [ 0.0548, -0.0290, -0.0895],\n",
       "                        [ 0.0658, -0.0009, -0.0232]],\n",
       "              \n",
       "                       [[-0.0512,  0.0499, -0.0488],\n",
       "                        [ 0.0522,  0.0588,  0.0295],\n",
       "                        [-0.0192, -0.0221,  0.0361]],\n",
       "              \n",
       "                       [[-0.0723,  0.0796,  0.0195],\n",
       "                        [-0.0807, -0.0576,  0.0611],\n",
       "                        [-0.0683,  0.0214,  0.0592]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0946,  0.0350,  0.0981],\n",
       "                        [-0.0854, -0.0635, -0.0793],\n",
       "                        [-0.0709, -0.0808, -0.0385]],\n",
       "              \n",
       "                       [[ 0.0541,  0.0208,  0.0130],\n",
       "                        [-0.0376,  0.0045, -0.0770],\n",
       "                        [ 0.0800,  0.0899, -0.0547]],\n",
       "              \n",
       "                       [[-0.0810,  0.0532, -0.0228],\n",
       "                        [-0.0748, -0.0007, -0.0749],\n",
       "                        [-0.0567,  0.0619,  0.0048]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0082, -0.0625, -0.0177],\n",
       "                        [-0.0312,  0.0559, -0.0651],\n",
       "                        [-0.0222,  0.0927, -0.0781]],\n",
       "              \n",
       "                       [[-0.0816,  0.0762,  0.1000],\n",
       "                        [-0.0685, -0.0013,  0.0301],\n",
       "                        [ 0.0235, -0.0128,  0.0726]],\n",
       "              \n",
       "                       [[-0.1002,  0.0976,  0.0986],\n",
       "                        [ 0.0262, -0.0978, -0.0735],\n",
       "                        [-0.0254,  0.0028, -0.0030]]],\n",
       "              \n",
       "              \n",
       "                      [[[-0.0197,  0.0944, -0.0633],\n",
       "                        [ 0.0708,  0.0492,  0.0537],\n",
       "                        [ 0.0278, -0.0487, -0.0095]],\n",
       "              \n",
       "                       [[-0.0350,  0.0419, -0.0561],\n",
       "                        [ 0.0634, -0.0166,  0.0835],\n",
       "                        [ 0.0921,  0.0958, -0.0597]],\n",
       "              \n",
       "                       [[ 0.0217, -0.0900, -0.0677],\n",
       "                        [ 0.0528, -0.0681, -0.0626],\n",
       "                        [ 0.0041,  0.0943,  0.0488]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0336,  0.0299, -0.0822],\n",
       "                        [-0.0997,  0.0909, -0.0685],\n",
       "                        [-0.0022, -0.0112,  0.1016]],\n",
       "              \n",
       "                       [[-0.0352,  0.0843,  0.0453],\n",
       "                        [ 0.0590, -0.0098, -0.0892],\n",
       "                        [ 0.0483, -0.0508, -0.0656]],\n",
       "              \n",
       "                       [[ 0.0782, -0.0009, -0.0740],\n",
       "                        [ 0.0101,  0.0258,  0.0727],\n",
       "                        [-0.0743, -0.0201, -0.0888]]],\n",
       "              \n",
       "              \n",
       "                      ...,\n",
       "              \n",
       "              \n",
       "                      [[[-0.0846, -0.0780, -0.0526],\n",
       "                        [-0.0943,  0.0213, -0.0838],\n",
       "                        [ 0.0306, -0.0004,  0.0809]],\n",
       "              \n",
       "                       [[-0.0960, -0.0889,  0.0104],\n",
       "                        [-0.0522, -0.0971, -0.0784],\n",
       "                        [ 0.0676, -0.0012, -0.0097]],\n",
       "              \n",
       "                       [[-0.0711,  0.0558, -0.0049],\n",
       "                        [-0.0882,  0.0157, -0.0154],\n",
       "                        [-0.1020,  0.0353, -0.0029]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0453,  0.0876, -0.0504],\n",
       "                        [ 0.0844,  0.0552, -0.0364],\n",
       "                        [ 0.0718,  0.0614, -0.0390]],\n",
       "              \n",
       "                       [[ 0.0135, -0.0868,  0.0772],\n",
       "                        [ 0.0122,  0.0070,  0.0300],\n",
       "                        [-0.0366, -0.0128, -0.0596]],\n",
       "              \n",
       "                       [[-0.0721, -0.0899,  0.0042],\n",
       "                        [-0.0856,  0.0377,  0.0498],\n",
       "                        [ 0.0525, -0.0217, -0.0715]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0835, -0.0996,  0.0537],\n",
       "                        [ 0.0839, -0.0266,  0.0991],\n",
       "                        [ 0.0552, -0.0204, -0.0913]],\n",
       "              \n",
       "                       [[-0.0778, -0.0602, -0.0754],\n",
       "                        [-0.0311,  0.0634,  0.0053],\n",
       "                        [ 0.0299,  0.0904, -0.0158]],\n",
       "              \n",
       "                       [[-0.0594, -0.0545, -0.0120],\n",
       "                        [-0.0485,  0.0626,  0.0327],\n",
       "                        [ 0.0273,  0.0926, -0.0191]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0438, -0.0642,  0.0948],\n",
       "                        [-0.0805,  0.0074, -0.0364],\n",
       "                        [-0.0209, -0.0882, -0.0256]],\n",
       "              \n",
       "                       [[-0.0862,  0.0674,  0.0797],\n",
       "                        [ 0.0700, -0.0292,  0.0934],\n",
       "                        [ 0.0918, -0.0031, -0.0528]],\n",
       "              \n",
       "                       [[-0.0745, -0.0540,  0.0217],\n",
       "                        [-0.0247,  0.0781, -0.0377],\n",
       "                        [-0.0133,  0.0644,  0.0927]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0745, -0.0755, -0.0253],\n",
       "                        [-0.0629,  0.0392, -0.0806],\n",
       "                        [ 0.0818, -0.0553, -0.0622]],\n",
       "              \n",
       "                       [[ 0.0317,  0.0669,  0.0269],\n",
       "                        [ 0.0164,  0.0219,  0.0239],\n",
       "                        [-0.0209,  0.0338,  0.0002]],\n",
       "              \n",
       "                       [[-0.0366, -0.0196, -0.0986],\n",
       "                        [-0.0239, -0.0351, -0.0299],\n",
       "                        [ 0.0516,  0.0110, -0.0093]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0159,  0.0941, -0.0317],\n",
       "                        [-0.0285, -0.0312,  0.0721],\n",
       "                        [-0.0395, -0.0080, -0.0920]],\n",
       "              \n",
       "                       [[-0.0999,  0.0618,  0.0864],\n",
       "                        [-0.0418, -0.0468,  0.0559],\n",
       "                        [ 0.0074,  0.0656,  0.0291]],\n",
       "              \n",
       "                       [[ 0.0913, -0.0643, -0.0201],\n",
       "                        [-0.0180,  0.0222, -0.0178],\n",
       "                        [-0.0198,  0.0454, -0.0530]]]])),\n",
       "             ('conv2.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('conv3.weight',\n",
       "              tensor([[[[-1.9851e-02,  6.8706e-02,  6.0227e-02],\n",
       "                        [-2.8886e-02,  5.4061e-02, -4.4401e-02],\n",
       "                        [ 6.9847e-02, -2.2532e-02, -5.2110e-02]],\n",
       "              \n",
       "                       [[ 5.4893e-02, -6.9748e-02, -3.0140e-02],\n",
       "                        [ 6.1495e-02, -1.1097e-02, -7.9872e-03],\n",
       "                        [ 4.1147e-02, -3.7999e-02, -4.1880e-03]],\n",
       "              \n",
       "                       [[ 6.8600e-02, -1.5743e-02,  3.0868e-03],\n",
       "                        [-4.0270e-02,  1.2104e-02, -2.2401e-02],\n",
       "                        [ 7.9095e-02,  2.6012e-02, -2.3574e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-7.5689e-02, -4.9824e-02, -4.5312e-02],\n",
       "                        [ 1.4828e-02, -8.2691e-02,  8.6027e-03],\n",
       "                        [-5.2063e-02, -7.1708e-02,  3.0583e-03]],\n",
       "              \n",
       "                       [[ 1.3465e-02,  6.7482e-02,  7.9643e-02],\n",
       "                        [-5.4525e-02, -4.3668e-02, -5.9208e-02],\n",
       "                        [ 6.5435e-02, -2.7130e-02, -3.6660e-02]],\n",
       "              \n",
       "                       [[ 4.3057e-02,  4.0071e-02,  8.2271e-02],\n",
       "                        [-1.4339e-03, -7.2655e-04,  2.8989e-02],\n",
       "                        [-5.5304e-03,  6.1046e-02, -4.1395e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-4.3909e-02,  3.9249e-02,  2.2808e-02],\n",
       "                        [-5.3013e-03,  1.5520e-02,  3.1472e-02],\n",
       "                        [ 1.4996e-02,  3.9696e-02,  6.1809e-02]],\n",
       "              \n",
       "                       [[ 5.3840e-02, -4.8794e-02, -7.1332e-02],\n",
       "                        [-5.4076e-02,  3.3228e-02, -5.4810e-02],\n",
       "                        [ 6.0435e-02,  5.1962e-02,  2.2343e-02]],\n",
       "              \n",
       "                       [[ 2.8096e-02,  3.4415e-02,  6.7001e-03],\n",
       "                        [ 1.6874e-02,  1.3438e-02, -4.0655e-02],\n",
       "                        [ 6.0668e-02,  9.5012e-03, -1.5992e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-3.4833e-02, -6.2625e-02,  6.9780e-02],\n",
       "                        [-7.0863e-02,  7.1346e-02, -4.5675e-03],\n",
       "                        [-4.6231e-02, -4.7022e-02,  6.6728e-03]],\n",
       "              \n",
       "                       [[-3.1847e-02, -4.0871e-02,  4.3529e-02],\n",
       "                        [ 2.7212e-02, -2.4035e-02, -6.3609e-03],\n",
       "                        [ 3.6390e-03, -4.4464e-02,  7.1168e-02]],\n",
       "              \n",
       "                       [[ 1.2102e-02, -6.3839e-02, -5.5689e-04],\n",
       "                        [ 3.7081e-02, -1.5751e-02,  5.3161e-02],\n",
       "                        [ 8.2611e-02,  7.1053e-02,  4.7658e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 5.9156e-02, -3.6908e-02, -3.9688e-02],\n",
       "                        [-1.0987e-02, -4.5106e-02,  7.8018e-02],\n",
       "                        [-1.6946e-02, -6.4305e-02,  5.6938e-02]],\n",
       "              \n",
       "                       [[-2.0229e-02,  9.1811e-03, -6.9401e-02],\n",
       "                        [ 5.6217e-03, -6.9234e-02, -3.7894e-02],\n",
       "                        [ 3.6090e-02, -2.7466e-03, -2.9260e-02]],\n",
       "              \n",
       "                       [[-8.0437e-03, -7.0111e-02, -7.2408e-02],\n",
       "                        [ 7.5715e-02, -3.8937e-02, -6.4347e-02],\n",
       "                        [ 2.3012e-02,  2.5667e-02, -5.7225e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-4.8982e-02, -7.9944e-02,  2.4162e-02],\n",
       "                        [ 3.2924e-02,  2.3475e-02, -3.0310e-02],\n",
       "                        [ 1.7288e-02,  3.6779e-02, -2.0361e-02]],\n",
       "              \n",
       "                       [[ 7.8452e-02,  3.8795e-02, -6.5357e-03],\n",
       "                        [ 5.4519e-02,  5.3209e-02, -5.7375e-02],\n",
       "                        [ 4.8345e-02, -7.2299e-02, -6.7927e-02]],\n",
       "              \n",
       "                       [[-2.1995e-02, -4.4262e-02, -9.4290e-03],\n",
       "                        [-4.0127e-02,  1.9062e-02,  1.7068e-02],\n",
       "                        [ 3.9768e-02, -5.1814e-02, -4.7621e-02]]],\n",
       "              \n",
       "              \n",
       "                      ...,\n",
       "              \n",
       "              \n",
       "                      [[[ 6.3498e-02,  4.3399e-02, -9.5951e-03],\n",
       "                        [-8.3102e-02,  4.7347e-02, -2.9320e-03],\n",
       "                        [ 1.2994e-02, -2.0626e-02,  5.4239e-02]],\n",
       "              \n",
       "                       [[-3.1865e-02,  3.6303e-02, -3.3373e-02],\n",
       "                        [ 2.6514e-02,  1.7071e-02,  1.5476e-03],\n",
       "                        [-5.4826e-02, -3.5913e-02,  4.6511e-02]],\n",
       "              \n",
       "                       [[-2.3936e-02, -8.0129e-02,  1.5631e-02],\n",
       "                        [-6.3423e-02, -5.7514e-02, -3.6030e-02],\n",
       "                        [-7.1799e-02, -2.2145e-02, -4.8694e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 7.3356e-03,  2.7350e-02,  4.5848e-02],\n",
       "                        [ 5.8106e-02, -1.9850e-02,  9.0987e-03],\n",
       "                        [-3.4676e-02,  6.5306e-02, -8.2328e-02]],\n",
       "              \n",
       "                       [[-7.8075e-02, -2.1230e-02,  8.5628e-03],\n",
       "                        [ 8.2367e-02,  4.6448e-02, -2.5571e-02],\n",
       "                        [-7.3937e-02, -4.1733e-02,  6.1092e-02]],\n",
       "              \n",
       "                       [[-6.9757e-02, -9.8060e-03, -3.4054e-02],\n",
       "                        [ 3.2744e-03, -7.2299e-03, -3.1619e-02],\n",
       "                        [-1.7881e-02,  5.3073e-02,  3.7830e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 3.5056e-02, -7.9198e-02, -3.3788e-05],\n",
       "                        [-2.5901e-02, -6.4699e-02, -2.4080e-02],\n",
       "                        [ 2.8438e-02,  6.9827e-02,  2.8279e-02]],\n",
       "              \n",
       "                       [[ 7.4407e-02, -5.4549e-02, -5.7933e-02],\n",
       "                        [-6.9820e-03,  1.4827e-02,  7.2922e-02],\n",
       "                        [-3.4602e-02,  7.3227e-02, -9.5381e-03]],\n",
       "              \n",
       "                       [[ 7.6201e-02, -3.4808e-02, -5.4734e-02],\n",
       "                        [-3.7056e-03, -6.1601e-02,  7.5757e-02],\n",
       "                        [ 8.0515e-02, -2.3001e-02, -6.7457e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 2.9813e-02, -2.5784e-02, -7.0635e-02],\n",
       "                        [ 6.9735e-02, -3.9607e-02, -6.9189e-02],\n",
       "                        [-4.6477e-02, -1.8222e-02,  2.1825e-02]],\n",
       "              \n",
       "                       [[-3.3839e-02,  4.8052e-02, -3.7994e-02],\n",
       "                        [ 2.8082e-02,  8.1144e-02, -7.9839e-02],\n",
       "                        [-1.7756e-02,  5.7842e-02, -3.1677e-02]],\n",
       "              \n",
       "                       [[ 1.8307e-02, -5.4222e-02,  4.9310e-02],\n",
       "                        [-7.6830e-02,  1.8299e-03, -3.5730e-02],\n",
       "                        [ 6.5258e-02,  1.7439e-02,  2.4171e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 5.6390e-02, -4.0051e-02,  6.7264e-02],\n",
       "                        [-7.0830e-02, -3.1997e-02,  2.9081e-03],\n",
       "                        [ 6.3139e-02,  6.7227e-02, -2.2146e-02]],\n",
       "              \n",
       "                       [[-7.5571e-02,  2.6460e-02,  6.8301e-02],\n",
       "                        [ 4.9539e-03,  7.4384e-02, -2.5274e-02],\n",
       "                        [ 9.4988e-03,  8.3197e-03, -8.1539e-03]],\n",
       "              \n",
       "                       [[ 5.2507e-02, -4.1803e-02, -7.1285e-02],\n",
       "                        [-5.5016e-02,  4.2059e-02,  1.1960e-02],\n",
       "                        [-2.2519e-02, -3.6240e-02,  3.6083e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 1.1320e-02, -1.8094e-02,  6.6551e-02],\n",
       "                        [-1.3671e-02,  3.7858e-02,  1.3799e-02],\n",
       "                        [-9.5710e-03, -5.8060e-03, -7.7772e-03]],\n",
       "              \n",
       "                       [[-1.8302e-02, -3.0078e-02,  5.6104e-02],\n",
       "                        [ 4.5238e-03,  4.0042e-02,  6.5036e-02],\n",
       "                        [ 5.6642e-02, -6.9944e-02,  8.1579e-02]],\n",
       "              \n",
       "                       [[-6.2835e-02, -6.7294e-02, -4.1498e-02],\n",
       "                        [-6.0578e-02,  7.9192e-02, -8.0457e-02],\n",
       "                        [-7.9520e-02,  3.3830e-02,  5.9663e-02]]]])),\n",
       "             ('conv3.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('conv4.weight',\n",
       "              tensor([[[[ 6.0364e-02,  6.5638e-02,  3.4439e-03],\n",
       "                        [-4.0215e-02,  2.9556e-02, -5.5694e-02],\n",
       "                        [ 3.6350e-02,  4.5027e-02,  5.1116e-02]],\n",
       "              \n",
       "                       [[-1.0052e-02,  6.3601e-02,  1.3369e-02],\n",
       "                        [-5.9767e-03, -3.3412e-03, -2.9950e-02],\n",
       "                        [-8.1404e-03, -5.8009e-02,  6.3932e-04]],\n",
       "              \n",
       "                       [[-3.7493e-02,  3.9701e-02,  2.4004e-02],\n",
       "                        [-3.5960e-02, -1.0294e-02, -8.8385e-03],\n",
       "                        [-4.6559e-03, -4.0604e-02, -1.5537e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 1.9537e-02,  6.6122e-02, -5.8558e-02],\n",
       "                        [-1.1357e-03, -2.1838e-02, -1.2300e-02],\n",
       "                        [ 1.2824e-02,  4.1182e-02, -8.3348e-03]],\n",
       "              \n",
       "                       [[-4.0990e-02, -4.2591e-02, -5.9246e-02],\n",
       "                        [ 4.5461e-03,  2.4217e-02, -6.7774e-02],\n",
       "                        [ 6.8548e-02, -4.0636e-02, -3.8765e-02]],\n",
       "              \n",
       "                       [[-1.0902e-02, -2.5067e-02,  6.9865e-02],\n",
       "                        [ 7.0486e-02, -9.7224e-03, -4.6745e-02],\n",
       "                        [-4.2126e-02,  4.4875e-02,  1.2676e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-2.9526e-02,  2.8723e-03, -2.0403e-02],\n",
       "                        [ 6.3943e-02, -3.2324e-02,  4.2855e-02],\n",
       "                        [-3.4436e-02,  6.2185e-02,  2.8651e-02]],\n",
       "              \n",
       "                       [[ 4.9391e-02,  6.5921e-02, -7.1191e-02],\n",
       "                        [ 6.4490e-02,  9.7884e-03,  4.5657e-02],\n",
       "                        [-5.8020e-02,  4.3222e-02, -4.1385e-02]],\n",
       "              \n",
       "                       [[ 8.5334e-03, -4.6778e-02,  9.4733e-03],\n",
       "                        [ 1.4456e-02,  8.3533e-03,  2.5592e-02],\n",
       "                        [ 1.7775e-03,  1.9506e-02, -3.2889e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 4.8596e-02,  5.7061e-02,  5.1332e-02],\n",
       "                        [ 2.6395e-02, -4.4912e-02, -7.1648e-02],\n",
       "                        [-2.9929e-02,  4.4583e-02,  4.2918e-02]],\n",
       "              \n",
       "                       [[-3.9596e-02,  1.8967e-02,  6.1032e-02],\n",
       "                        [-5.2699e-02, -5.1257e-02, -4.6832e-02],\n",
       "                        [ 1.1412e-02,  4.4881e-02, -6.7276e-02]],\n",
       "              \n",
       "                       [[-2.4113e-02,  2.3988e-02, -2.7391e-02],\n",
       "                        [-3.3553e-02,  4.7551e-02, -4.3562e-02],\n",
       "                        [ 3.5854e-02,  2.3326e-02, -5.0473e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-3.0607e-02,  4.1719e-02,  1.6141e-02],\n",
       "                        [ 6.9484e-02,  1.3795e-02, -6.8838e-02],\n",
       "                        [-3.8969e-02,  3.5993e-02, -4.5707e-02]],\n",
       "              \n",
       "                       [[ 6.7988e-02,  6.9394e-02, -6.5540e-02],\n",
       "                        [-4.3081e-02, -3.2918e-02,  5.1580e-02],\n",
       "                        [ 8.4563e-03, -4.1032e-02, -3.9616e-02]],\n",
       "              \n",
       "                       [[-7.7494e-03,  1.9532e-03, -7.7575e-04],\n",
       "                        [ 1.2987e-02, -3.8269e-02,  2.7737e-02],\n",
       "                        [ 4.0266e-02,  4.4939e-02,  6.2125e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-1.5164e-02, -6.9292e-02,  6.7685e-02],\n",
       "                        [-2.5364e-02, -6.6686e-02, -4.3595e-02],\n",
       "                        [ 3.8219e-02,  1.7499e-02, -3.6972e-02]],\n",
       "              \n",
       "                       [[ 7.1598e-02,  2.5923e-02,  2.8051e-03],\n",
       "                        [ 2.3252e-02, -6.4099e-02, -2.0583e-02],\n",
       "                        [-5.0575e-02,  6.9757e-02, -4.4123e-02]],\n",
       "              \n",
       "                       [[ 7.2074e-02, -4.4794e-02,  2.4768e-02],\n",
       "                        [-5.9435e-02,  5.1812e-02, -6.0488e-02],\n",
       "                        [ 2.8945e-02,  1.2024e-02, -6.3668e-02]]],\n",
       "              \n",
       "              \n",
       "                      ...,\n",
       "              \n",
       "              \n",
       "                      [[[ 6.1102e-02, -5.4984e-02,  8.8535e-03],\n",
       "                        [-2.7102e-02,  4.3304e-03, -1.4120e-02],\n",
       "                        [ 6.5440e-03,  5.3928e-04,  5.0465e-02]],\n",
       "              \n",
       "                       [[-2.7098e-02, -3.2392e-02,  4.6614e-02],\n",
       "                        [ 4.9596e-02, -2.1259e-02, -1.7654e-02],\n",
       "                        [-5.3839e-02, -1.3289e-02,  5.9496e-02]],\n",
       "              \n",
       "                       [[-6.9468e-02, -5.5287e-02,  3.4909e-02],\n",
       "                        [ 2.8992e-02,  8.0701e-03, -4.5262e-02],\n",
       "                        [-3.7760e-02,  4.7170e-03, -3.6214e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-4.0723e-02, -3.2259e-02,  4.9648e-02],\n",
       "                        [-4.1466e-02,  7.9030e-03, -5.3387e-02],\n",
       "                        [ 6.5075e-02, -2.7688e-03,  2.5199e-02]],\n",
       "              \n",
       "                       [[ 2.6234e-02,  8.0576e-03,  2.2481e-02],\n",
       "                        [-6.9613e-02, -5.8365e-02,  4.8053e-02],\n",
       "                        [-3.5706e-02, -5.8022e-02,  1.6241e-02]],\n",
       "              \n",
       "                       [[-3.8089e-02, -6.5865e-02, -6.1549e-02],\n",
       "                        [-5.9706e-02, -6.2015e-02,  2.7744e-02],\n",
       "                        [-5.2536e-02, -1.6755e-02,  2.9272e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 5.5725e-02, -4.1084e-02, -1.1808e-02],\n",
       "                        [ 3.5369e-02,  6.4254e-02,  7.0072e-02],\n",
       "                        [-3.1894e-02,  3.2044e-03, -3.8709e-02]],\n",
       "              \n",
       "                       [[ 5.6489e-02, -6.8949e-02,  2.2555e-02],\n",
       "                        [-6.5922e-02,  7.8744e-03,  6.7006e-02],\n",
       "                        [ 6.7653e-02, -3.6703e-02,  5.2044e-02]],\n",
       "              \n",
       "                       [[-6.2278e-02,  4.3995e-02, -3.4628e-03],\n",
       "                        [-6.3853e-02, -5.5807e-02,  3.9756e-02],\n",
       "                        [ 1.6487e-02, -2.2544e-02, -9.1653e-03]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-4.6358e-02,  4.4385e-02,  5.5733e-02],\n",
       "                        [ 4.5244e-03, -2.9369e-02,  2.3151e-02],\n",
       "                        [ 5.6130e-02,  1.6102e-02,  1.6607e-02]],\n",
       "              \n",
       "                       [[ 5.8294e-04, -6.9467e-02, -1.1689e-02],\n",
       "                        [ 6.4227e-02, -6.4280e-02, -5.4178e-02],\n",
       "                        [-6.2281e-02,  3.4453e-03, -5.4926e-04]],\n",
       "              \n",
       "                       [[ 5.5726e-02, -2.8617e-02,  1.7242e-02],\n",
       "                        [ 6.8432e-02,  6.6183e-02, -6.0127e-02],\n",
       "                        [ 7.1249e-02, -1.1319e-02, -9.5385e-04]]],\n",
       "              \n",
       "              \n",
       "                      [[[-4.2551e-02, -3.4790e-02,  6.0273e-02],\n",
       "                        [-5.5952e-02,  1.8338e-02, -5.2642e-02],\n",
       "                        [-2.8594e-02, -1.0402e-03, -5.0046e-02]],\n",
       "              \n",
       "                       [[ 1.5991e-02,  2.2573e-02, -4.3869e-02],\n",
       "                        [-2.9065e-02, -6.6742e-02,  6.2943e-02],\n",
       "                        [ 4.9271e-03,  6.3816e-02, -2.2058e-03]],\n",
       "              \n",
       "                       [[ 9.4659e-03, -3.5035e-02, -1.0136e-02],\n",
       "                        [-6.5730e-03, -4.9389e-02, -4.1088e-02],\n",
       "                        [-5.9219e-02,  1.9979e-02,  1.2794e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-1.4196e-02,  5.6988e-02, -2.5414e-02],\n",
       "                        [-1.8886e-03,  4.6702e-02,  5.5521e-02],\n",
       "                        [-5.7718e-02,  1.8885e-02, -3.3410e-02]],\n",
       "              \n",
       "                       [[ 7.7696e-03, -1.1713e-02, -2.5579e-02],\n",
       "                        [ 6.3032e-05, -5.0387e-02, -5.0513e-02],\n",
       "                        [ 4.9991e-02,  2.4515e-02, -3.0655e-02]],\n",
       "              \n",
       "                       [[-2.2548e-02,  2.9073e-02,  5.6824e-02],\n",
       "                        [ 7.5086e-03,  4.9806e-02, -2.0928e-02],\n",
       "                        [-5.2521e-02,  6.9637e-02,  2.6935e-02]]]])),\n",
       "             ('conv4.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('conv5.weight',\n",
       "              tensor([[[[-2.1213e-02, -4.0364e-02,  4.4882e-02],\n",
       "                        [ 4.7575e-02, -2.6314e-02, -2.4949e-03],\n",
       "                        [ 5.6290e-02, -9.5551e-03,  1.7977e-02]],\n",
       "              \n",
       "                       [[-2.9077e-03, -5.0178e-02,  2.0568e-02],\n",
       "                        [-4.3429e-03, -8.6891e-03,  3.5939e-02],\n",
       "                        [ 2.5996e-02,  5.5568e-02, -4.6230e-02]],\n",
       "              \n",
       "                       [[-1.0237e-02,  5.6009e-03,  4.7134e-02],\n",
       "                        [ 2.6562e-03, -1.5727e-02,  1.7607e-02],\n",
       "                        [ 9.3821e-03, -3.6197e-02,  1.8333e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 2.2667e-02,  1.8400e-02, -4.6190e-02],\n",
       "                        [ 3.9930e-02, -3.8400e-02,  2.8238e-02],\n",
       "                        [ 4.3745e-02,  3.1889e-04,  2.6219e-04]],\n",
       "              \n",
       "                       [[-1.2640e-02,  1.5186e-02,  2.4183e-02],\n",
       "                        [-1.8940e-02,  5.0477e-02,  3.1678e-02],\n",
       "                        [ 3.1497e-03, -2.0235e-02, -3.9058e-02]],\n",
       "              \n",
       "                       [[-5.7074e-02, -3.9389e-02,  3.2147e-02],\n",
       "                        [-3.9334e-02,  4.0440e-02,  3.5771e-02],\n",
       "                        [ 4.6073e-02, -4.8340e-03, -5.7799e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-1.0838e-02,  1.2690e-02,  4.3689e-02],\n",
       "                        [ 4.0704e-02,  5.7458e-02, -4.6164e-02],\n",
       "                        [-5.5405e-02,  5.0851e-03, -1.8734e-02]],\n",
       "              \n",
       "                       [[-4.4801e-02,  1.3727e-02, -3.8799e-03],\n",
       "                        [ 3.3087e-02, -5.8590e-02, -3.3789e-02],\n",
       "                        [-2.2287e-02, -4.9497e-02, -3.6455e-02]],\n",
       "              \n",
       "                       [[-1.6984e-02, -2.2494e-02, -5.0430e-02],\n",
       "                        [ 5.3085e-02,  5.5452e-03, -1.5907e-03],\n",
       "                        [ 4.4534e-02, -1.9862e-02, -3.6761e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 2.6201e-02, -1.4022e-02,  3.1834e-02],\n",
       "                        [ 4.1563e-02,  5.2973e-03,  4.6166e-02],\n",
       "                        [-9.3210e-03, -3.3629e-02,  3.6211e-02]],\n",
       "              \n",
       "                       [[ 5.9363e-03,  4.9201e-02,  1.3074e-02],\n",
       "                        [ 4.6736e-02, -2.7526e-02,  2.0255e-02],\n",
       "                        [ 2.9440e-02,  3.3356e-02,  1.4453e-02]],\n",
       "              \n",
       "                       [[-1.4180e-02, -2.6843e-03,  1.3575e-02],\n",
       "                        [ 6.8842e-03,  2.7892e-02, -1.6482e-02],\n",
       "                        [-4.7933e-02, -1.7107e-02, -2.1726e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-2.9584e-02, -3.7552e-02,  4.3228e-02],\n",
       "                        [-3.0138e-03,  4.6679e-02,  3.8625e-02],\n",
       "                        [ 2.1927e-02, -2.3545e-02, -5.3437e-02]],\n",
       "              \n",
       "                       [[ 5.0664e-02,  1.1268e-02,  5.2184e-02],\n",
       "                        [ 2.4791e-02, -3.7040e-02,  4.2071e-02],\n",
       "                        [-5.0545e-02, -2.9119e-02,  5.6889e-02]],\n",
       "              \n",
       "                       [[ 5.5920e-02,  1.5640e-02,  2.8918e-02],\n",
       "                        [-3.1818e-04,  2.1879e-02, -1.0076e-02],\n",
       "                        [-2.4005e-03,  5.4307e-02,  6.1669e-03]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-8.4988e-03, -2.4480e-02,  4.1453e-02],\n",
       "                        [-4.6192e-02, -4.4551e-02, -1.0662e-02],\n",
       "                        [-5.3443e-03, -2.5204e-02,  3.6266e-02]],\n",
       "              \n",
       "                       [[ 1.3286e-02,  2.0361e-02, -2.3929e-02],\n",
       "                        [ 2.3617e-02, -2.6469e-02,  5.6881e-02],\n",
       "                        [-3.7730e-02,  5.8596e-02,  3.2476e-02]],\n",
       "              \n",
       "                       [[-5.8549e-02, -2.7393e-02,  7.3609e-04],\n",
       "                        [-2.0772e-02, -1.5186e-02, -3.7154e-03],\n",
       "                        [ 9.9866e-03,  3.6182e-02, -5.9888e-03]]],\n",
       "              \n",
       "              \n",
       "                      ...,\n",
       "              \n",
       "              \n",
       "                      [[[-9.9436e-03,  3.4023e-03,  3.6074e-02],\n",
       "                        [ 4.2181e-02,  5.0747e-02,  1.3258e-02],\n",
       "                        [-2.1909e-02,  4.2745e-02,  3.0278e-02]],\n",
       "              \n",
       "                       [[ 4.6750e-02, -1.2263e-02, -3.1435e-02],\n",
       "                        [ 4.6875e-03,  5.1601e-02,  4.0982e-02],\n",
       "                        [-2.8932e-02, -4.1023e-03,  4.3395e-02]],\n",
       "              \n",
       "                       [[-1.6947e-02, -1.8293e-02, -6.2377e-03],\n",
       "                        [ 2.4794e-03, -1.8926e-03,  2.2354e-02],\n",
       "                        [ 3.6552e-02, -4.0890e-02, -3.0116e-04]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 3.8129e-02,  9.1722e-03, -9.9023e-03],\n",
       "                        [-1.1673e-02, -4.2960e-03,  5.6186e-02],\n",
       "                        [-2.9957e-02, -3.9262e-04,  6.4737e-03]],\n",
       "              \n",
       "                       [[-2.9688e-02, -5.5057e-02, -5.3254e-02],\n",
       "                        [ 3.5726e-02, -3.4927e-02,  4.7021e-02],\n",
       "                        [ 1.4754e-02,  2.2053e-02, -5.4052e-02]],\n",
       "              \n",
       "                       [[-9.3663e-03, -7.6834e-05, -4.0525e-02],\n",
       "                        [-1.6921e-02, -1.7257e-03,  3.6423e-02],\n",
       "                        [ 2.0546e-02, -6.3369e-03, -1.4875e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 2.2443e-02, -5.5334e-02,  3.6820e-02],\n",
       "                        [-4.7570e-02, -2.4785e-03, -3.1017e-02],\n",
       "                        [ 3.0899e-03,  4.3438e-03,  4.0561e-02]],\n",
       "              \n",
       "                       [[-3.7678e-02,  2.4869e-02,  5.0083e-02],\n",
       "                        [-1.9188e-03, -2.2722e-02,  4.4875e-02],\n",
       "                        [ 4.4268e-03, -4.6879e-02,  1.1802e-02]],\n",
       "              \n",
       "                       [[ 2.8079e-02,  1.7862e-02, -5.4260e-02],\n",
       "                        [ 5.4290e-02,  3.1231e-03, -5.6911e-02],\n",
       "                        [ 3.3138e-02,  9.7103e-03, -5.5347e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 5.4730e-02,  4.0904e-02,  3.3045e-02],\n",
       "                        [-1.5002e-02, -3.8360e-02, -4.7177e-03],\n",
       "                        [-5.7192e-02,  1.8132e-03, -4.7901e-02]],\n",
       "              \n",
       "                       [[ 6.7808e-03,  5.3310e-03, -2.2622e-02],\n",
       "                        [-1.2139e-02,  7.0551e-03,  2.0486e-02],\n",
       "                        [-1.0295e-02, -2.0972e-02, -4.0748e-02]],\n",
       "              \n",
       "                       [[-8.4580e-04, -5.4325e-02, -3.9909e-02],\n",
       "                        [-1.2117e-02,  1.6423e-02,  5.1255e-02],\n",
       "                        [-8.8174e-03, -2.4629e-02,  4.4259e-02]]],\n",
       "              \n",
       "              \n",
       "                      [[[-2.7734e-02,  2.7951e-02, -9.9197e-03],\n",
       "                        [ 1.7097e-02, -5.4875e-03, -1.4301e-02],\n",
       "                        [ 2.4929e-02, -2.6879e-02,  5.6447e-02]],\n",
       "              \n",
       "                       [[ 1.4666e-02, -4.4004e-02,  9.2719e-04],\n",
       "                        [ 3.1008e-02, -3.8831e-02, -1.9957e-03],\n",
       "                        [ 5.6554e-02,  2.3542e-02, -4.1876e-02]],\n",
       "              \n",
       "                       [[ 2.4967e-02, -4.3959e-02, -2.2495e-02],\n",
       "                        [-3.2720e-02, -4.5027e-02, -2.8104e-02],\n",
       "                        [ 7.5845e-03,  3.0880e-02, -4.6337e-02]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-5.6443e-02, -4.9108e-02, -2.8315e-02],\n",
       "                        [-5.5730e-02,  1.4488e-02, -1.8482e-02],\n",
       "                        [ 2.0433e-02,  5.9295e-03,  4.1087e-02]],\n",
       "              \n",
       "                       [[ 5.0731e-02, -3.7320e-02, -2.8647e-02],\n",
       "                        [-5.3168e-02, -3.6032e-02, -2.3055e-02],\n",
       "                        [-4.4298e-02, -1.4856e-02, -4.8925e-02]],\n",
       "              \n",
       "                       [[ 1.9209e-02, -2.3164e-02,  7.7650e-03],\n",
       "                        [ 5.1600e-02,  4.6201e-02, -3.0780e-02],\n",
       "                        [ 4.1803e-02,  4.5820e-02, -3.9490e-02]]]])),\n",
       "             ('conv5.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('conv6.weight',\n",
       "              tensor([[[[-0.0259,  0.0473,  0.0098],\n",
       "                        [-0.0401, -0.0460, -0.0048],\n",
       "                        [ 0.0249,  0.0246,  0.0374]],\n",
       "              \n",
       "                       [[ 0.0191,  0.0150, -0.0046],\n",
       "                        [-0.0068, -0.0070, -0.0442],\n",
       "                        [ 0.0022, -0.0098,  0.0283]],\n",
       "              \n",
       "                       [[ 0.0183,  0.0196,  0.0248],\n",
       "                        [ 0.0474,  0.0452,  0.0427],\n",
       "                        [-0.0171, -0.0404,  0.0309]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0461,  0.0408,  0.0417],\n",
       "                        [ 0.0145,  0.0362, -0.0227],\n",
       "                        [-0.0331,  0.0382,  0.0018]],\n",
       "              \n",
       "                       [[-0.0042, -0.0316, -0.0348],\n",
       "                        [-0.0070, -0.0002,  0.0483],\n",
       "                        [-0.0189, -0.0451,  0.0141]],\n",
       "              \n",
       "                       [[ 0.0404,  0.0332, -0.0133],\n",
       "                        [-0.0509,  0.0071, -0.0160],\n",
       "                        [ 0.0105, -0.0260,  0.0323]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0432, -0.0451,  0.0373],\n",
       "                        [ 0.0012, -0.0226, -0.0433],\n",
       "                        [ 0.0270, -0.0482, -0.0285]],\n",
       "              \n",
       "                       [[ 0.0003,  0.0466, -0.0266],\n",
       "                        [-0.0317, -0.0321,  0.0483],\n",
       "                        [ 0.0197,  0.0389, -0.0301]],\n",
       "              \n",
       "                       [[ 0.0289,  0.0081,  0.0093],\n",
       "                        [-0.0102, -0.0363, -0.0184],\n",
       "                        [ 0.0324, -0.0395, -0.0191]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0106, -0.0316, -0.0277],\n",
       "                        [-0.0480,  0.0057, -0.0004],\n",
       "                        [ 0.0417, -0.0307,  0.0270]],\n",
       "              \n",
       "                       [[-0.0494,  0.0428, -0.0173],\n",
       "                        [ 0.0163, -0.0091, -0.0197],\n",
       "                        [ 0.0372,  0.0276, -0.0247]],\n",
       "              \n",
       "                       [[-0.0422,  0.0093, -0.0028],\n",
       "                        [ 0.0226, -0.0311,  0.0335],\n",
       "                        [ 0.0178, -0.0255,  0.0349]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0113,  0.0078,  0.0249],\n",
       "                        [ 0.0165,  0.0014, -0.0331],\n",
       "                        [-0.0083,  0.0179, -0.0018]],\n",
       "              \n",
       "                       [[-0.0146,  0.0365, -0.0238],\n",
       "                        [ 0.0038, -0.0203,  0.0470],\n",
       "                        [ 0.0385,  0.0406, -0.0287]],\n",
       "              \n",
       "                       [[ 0.0431,  0.0445, -0.0238],\n",
       "                        [ 0.0289, -0.0058,  0.0419],\n",
       "                        [-0.0190, -0.0419, -0.0134]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0011, -0.0182, -0.0064],\n",
       "                        [-0.0179,  0.0032,  0.0309],\n",
       "                        [-0.0310, -0.0485, -0.0145]],\n",
       "              \n",
       "                       [[-0.0296,  0.0304, -0.0012],\n",
       "                        [-0.0278, -0.0349,  0.0141],\n",
       "                        [-0.0010,  0.0442, -0.0085]],\n",
       "              \n",
       "                       [[-0.0440, -0.0172, -0.0401],\n",
       "                        [-0.0039,  0.0231,  0.0491],\n",
       "                        [-0.0198, -0.0239,  0.0030]]],\n",
       "              \n",
       "              \n",
       "                      ...,\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0308,  0.0012,  0.0032],\n",
       "                        [ 0.0342, -0.0470,  0.0475],\n",
       "                        [-0.0309, -0.0391,  0.0343]],\n",
       "              \n",
       "                       [[-0.0273, -0.0421,  0.0042],\n",
       "                        [-0.0263,  0.0140, -0.0382],\n",
       "                        [ 0.0206,  0.0260,  0.0474]],\n",
       "              \n",
       "                       [[-0.0430,  0.0413, -0.0501],\n",
       "                        [ 0.0433, -0.0116, -0.0002],\n",
       "                        [ 0.0445,  0.0276,  0.0335]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[-0.0499, -0.0017, -0.0297],\n",
       "                        [ 0.0266, -0.0138, -0.0456],\n",
       "                        [ 0.0192,  0.0437,  0.0378]],\n",
       "              \n",
       "                       [[ 0.0097,  0.0486,  0.0234],\n",
       "                        [ 0.0146,  0.0285, -0.0478],\n",
       "                        [-0.0331,  0.0370,  0.0218]],\n",
       "              \n",
       "                       [[-0.0211, -0.0492, -0.0445],\n",
       "                        [ 0.0414,  0.0204,  0.0211],\n",
       "                        [-0.0061, -0.0099,  0.0306]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0383, -0.0257, -0.0037],\n",
       "                        [-0.0317, -0.0469, -0.0117],\n",
       "                        [ 0.0035, -0.0334,  0.0227]],\n",
       "              \n",
       "                       [[ 0.0036,  0.0281,  0.0213],\n",
       "                        [ 0.0250,  0.0430, -0.0258],\n",
       "                        [ 0.0035,  0.0220,  0.0396]],\n",
       "              \n",
       "                       [[ 0.0406, -0.0385, -0.0102],\n",
       "                        [ 0.0166,  0.0476,  0.0095],\n",
       "                        [-0.0041,  0.0034,  0.0332]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0287,  0.0205, -0.0401],\n",
       "                        [-0.0165, -0.0037,  0.0249],\n",
       "                        [-0.0062, -0.0342, -0.0177]],\n",
       "              \n",
       "                       [[ 0.0011,  0.0352,  0.0013],\n",
       "                        [-0.0056, -0.0140, -0.0409],\n",
       "                        [ 0.0344, -0.0458, -0.0483]],\n",
       "              \n",
       "                       [[ 0.0311, -0.0025,  0.0134],\n",
       "                        [-0.0003,  0.0426,  0.0377],\n",
       "                        [ 0.0252, -0.0269,  0.0220]]],\n",
       "              \n",
       "              \n",
       "                      [[[ 0.0265,  0.0270,  0.0189],\n",
       "                        [ 0.0357,  0.0466,  0.0050],\n",
       "                        [-0.0228,  0.0487, -0.0349]],\n",
       "              \n",
       "                       [[-0.0128, -0.0508,  0.0380],\n",
       "                        [-0.0226, -0.0341, -0.0395],\n",
       "                        [-0.0322,  0.0305,  0.0070]],\n",
       "              \n",
       "                       [[-0.0162,  0.0365,  0.0452],\n",
       "                        [-0.0372, -0.0322, -0.0027],\n",
       "                        [-0.0450,  0.0433, -0.0163]],\n",
       "              \n",
       "                       ...,\n",
       "              \n",
       "                       [[ 0.0322,  0.0142, -0.0264],\n",
       "                        [ 0.0292,  0.0005,  0.0017],\n",
       "                        [-0.0109,  0.0021,  0.0349]],\n",
       "              \n",
       "                       [[ 0.0148, -0.0442,  0.0175],\n",
       "                        [ 0.0026, -0.0154,  0.0475],\n",
       "                        [-0.0122, -0.0222, -0.0454]],\n",
       "              \n",
       "                       [[ 0.0277,  0.0503,  0.0043],\n",
       "                        [-0.0402,  0.0144, -0.0197],\n",
       "                        [ 0.0100,  0.0033, -0.0375]]]])),\n",
       "             ('conv6.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('fc1.weight',\n",
       "              tensor([[ 0.0476,  0.0340, -0.0597,  ...,  0.0510,  0.0286, -0.0176],\n",
       "                      [ 0.0170,  0.0402,  0.0471,  ..., -0.0005,  0.0500, -0.0172],\n",
       "                      [ 0.0337, -0.0119,  0.0284,  ..., -0.0418,  0.0042, -0.0150],\n",
       "                      ...,\n",
       "                      [ 0.0018,  0.0520,  0.0407,  ...,  0.0590,  0.0523, -0.0300],\n",
       "                      [-0.0104, -0.0490,  0.0106,  ...,  0.0371, -0.0119, -0.0394],\n",
       "                      [-0.0479,  0.0284,  0.0437,  ..., -0.0497, -0.0039, -0.0600]])),\n",
       "             ('fc1.bias',\n",
       "              tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
       "                      0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])),\n",
       "             ('fc2.weight',\n",
       "              tensor([[-0.1246,  0.1421, -0.0975,  ...,  0.0698,  0.1072, -0.0590],\n",
       "                      [-0.1232, -0.0539, -0.0915,  ...,  0.0606,  0.0907, -0.1369],\n",
       "                      [ 0.1460, -0.1195, -0.1395,  ..., -0.0834,  0.1112, -0.0744],\n",
       "                      ...,\n",
       "                      [-0.1482,  0.1037, -0.1145,  ...,  0.0057, -0.0247,  0.1139],\n",
       "                      [ 0.1044, -0.1099,  0.0539,  ...,  0.0600, -0.0537, -0.1131],\n",
       "                      [ 0.1472,  0.1254,  0.0062,  ...,  0.0654, -0.0105,  0.1343]])),\n",
       "             ('fc2.bias', tensor([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]))])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "model.state_dict()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 设置交叉熵损失函数，SGD优化器"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:40.023837Z",
     "start_time": "2025-06-26T01:43:40.019952Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "损失函数: CrossEntropyLoss()\n"
     ]
    }
   ],
   "source": [
    "model = NeuralNetwork()\n",
    "# 定义损失函数和优化器\n",
    "loss_fn = nn.CrossEntropyLoss()  # 交叉熵损失函数，适用于多分类问题，里边会做softmax，还有会把0-9标签转换成one-hot编码\n",
    "\n",
    "print(\"损失函数:\", loss_fn)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:43:40.035848Z",
     "start_time": "2025-06-26T01:43:40.032419Z"
    }
   },
   "outputs": [],
   "source": [
    "model = NeuralNetwork()\n",
    "\n",
    "optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)  # SGD优化器，学习率为0.01，动量为0.9"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.732814Z",
     "start_time": "2025-06-26T01:43:40.035848Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "使用设备: cpu\n",
      "训练开始，共43000步\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "8adb8b86b21a416e9cf2d0ae09f966f6",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "  0%|          | 0/43000 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(f\"使用设备: {device}\")\n",
    "model = model.to(device) #将模型移动到GPU\n",
    "early_stopping=EarlyStopping(patience=5, delta=0.001)\n",
    "model_saver=ModelSaver(save_dir='model_weights', save_best_only=True)\n",
    "\n",
    "\n",
    "model, history = train_classification_model(model, train_loader, val_loader, loss_fn, optimizer, device, num_epochs=50, early_stopping=early_stopping, model_saver=model_saver, tensorboard_logger=None)\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.737721Z",
     "start_time": "2025-06-26T01:45:37.732814Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 0.1547924280166626, 'acc': 93.75, 'step': 9401},\n",
       " {'loss': 0.31046798825263977, 'acc': 89.0625, 'step': 9402},\n",
       " {'loss': 0.11046310514211655, 'acc': 96.875, 'step': 9403},\n",
       " {'loss': 0.24028357863426208, 'acc': 90.625, 'step': 9404},\n",
       " {'loss': 0.26721835136413574, 'acc': 89.0625, 'step': 9405},\n",
       " {'loss': 0.2150113880634308, 'acc': 89.0625, 'step': 9406},\n",
       " {'loss': 0.4928027093410492, 'acc': 84.375, 'step': 9407},\n",
       " {'loss': 0.20720763504505157, 'acc': 95.3125, 'step': 9408},\n",
       " {'loss': 0.38967669010162354, 'acc': 85.9375, 'step': 9409},\n",
       " {'loss': 0.44880470633506775, 'acc': 84.375, 'step': 9410},\n",
       " {'loss': 0.31742972135543823, 'acc': 89.0625, 'step': 9411},\n",
       " {'loss': 0.1524515450000763, 'acc': 95.3125, 'step': 9412},\n",
       " {'loss': 0.2586272954940796, 'acc': 90.625, 'step': 9413},\n",
       " {'loss': 0.3900238275527954, 'acc': 78.125, 'step': 9414},\n",
       " {'loss': 0.27417251467704773, 'acc': 87.5, 'step': 9415},\n",
       " {'loss': 0.19726693630218506, 'acc': 92.1875, 'step': 9416},\n",
       " {'loss': 0.3505842089653015, 'acc': 90.625, 'step': 9417},\n",
       " {'loss': 0.26967161893844604, 'acc': 89.0625, 'step': 9418},\n",
       " {'loss': 0.33068859577178955, 'acc': 82.8125, 'step': 9419},\n",
       " {'loss': 0.24933630228042603, 'acc': 89.0625, 'step': 9420},\n",
       " {'loss': 0.2578052580356598, 'acc': 89.0625, 'step': 9421},\n",
       " {'loss': 0.5356611013412476, 'acc': 79.6875, 'step': 9422},\n",
       " {'loss': 0.2810977101325989, 'acc': 92.1875, 'step': 9423},\n",
       " {'loss': 0.31292831897735596, 'acc': 89.0625, 'step': 9424},\n",
       " {'loss': 0.22595667839050293, 'acc': 89.0625, 'step': 9425},\n",
       " {'loss': 0.2361590713262558, 'acc': 95.3125, 'step': 9426},\n",
       " {'loss': 0.33246225118637085, 'acc': 87.5, 'step': 9427},\n",
       " {'loss': 0.2456618994474411, 'acc': 89.0625, 'step': 9428},\n",
       " {'loss': 0.28381145000457764, 'acc': 90.625, 'step': 9429},\n",
       " {'loss': 0.21530845761299133, 'acc': 93.75, 'step': 9430},\n",
       " {'loss': 0.19616569578647614, 'acc': 92.1875, 'step': 9431},\n",
       " {'loss': 0.2537690997123718, 'acc': 92.1875, 'step': 9432},\n",
       " {'loss': 0.23877759277820587, 'acc': 92.1875, 'step': 9433},\n",
       " {'loss': 0.309629887342453, 'acc': 89.0625, 'step': 9434},\n",
       " {'loss': 0.5600196719169617, 'acc': 79.6875, 'step': 9435},\n",
       " {'loss': 0.2708642780780792, 'acc': 85.9375, 'step': 9436},\n",
       " {'loss': 0.5061455368995667, 'acc': 81.25, 'step': 9437},\n",
       " {'loss': 0.20905479788780212, 'acc': 92.1875, 'step': 9438},\n",
       " {'loss': 0.2350572943687439, 'acc': 92.1875, 'step': 9439},\n",
       " {'loss': 0.2390000969171524, 'acc': 92.1875, 'step': 9440},\n",
       " {'loss': 0.18417389690876007, 'acc': 96.875, 'step': 9441},\n",
       " {'loss': 0.47598397731781006, 'acc': 81.25, 'step': 9442},\n",
       " {'loss': 0.1994292438030243, 'acc': 90.625, 'step': 9443},\n",
       " {'loss': 0.3940974473953247, 'acc': 84.375, 'step': 9444},\n",
       " {'loss': 0.35674136877059937, 'acc': 87.5, 'step': 9445},\n",
       " {'loss': 0.4041430652141571, 'acc': 82.8125, 'step': 9446},\n",
       " {'loss': 0.1812359243631363, 'acc': 93.75, 'step': 9447},\n",
       " {'loss': 0.2626109719276428, 'acc': 93.75, 'step': 9448},\n",
       " {'loss': 0.3338093161582947, 'acc': 90.625, 'step': 9449},\n",
       " {'loss': 0.30305927991867065, 'acc': 89.0625, 'step': 9450},\n",
       " {'loss': 0.29659053683280945, 'acc': 89.0625, 'step': 9451},\n",
       " {'loss': 0.2332083284854889, 'acc': 90.625, 'step': 9452},\n",
       " {'loss': 0.3019041121006012, 'acc': 87.5, 'step': 9453},\n",
       " {'loss': 0.17690005898475647, 'acc': 92.1875, 'step': 9454},\n",
       " {'loss': 0.2881486117839813, 'acc': 89.0625, 'step': 9455},\n",
       " {'loss': 0.20606306195259094, 'acc': 89.0625, 'step': 9456},\n",
       " {'loss': 0.2716468274593353, 'acc': 93.75, 'step': 9457},\n",
       " {'loss': 0.28289008140563965, 'acc': 90.625, 'step': 9458},\n",
       " {'loss': 0.18102611601352692, 'acc': 91.66666865348816, 'step': 9459},\n",
       " {'loss': 0.09133979678153992, 'acc': 98.4375, 'step': 9460},\n",
       " {'loss': 0.30004262924194336, 'acc': 87.5, 'step': 9461},\n",
       " {'loss': 0.1758502572774887, 'acc': 95.3125, 'step': 9462},\n",
       " {'loss': 0.18347439169883728, 'acc': 93.75, 'step': 9463},\n",
       " {'loss': 0.23629344999790192, 'acc': 92.1875, 'step': 9464},\n",
       " {'loss': 0.32900503277778625, 'acc': 89.0625, 'step': 9465},\n",
       " {'loss': 0.24245496094226837, 'acc': 90.625, 'step': 9466},\n",
       " {'loss': 0.22118225693702698, 'acc': 92.1875, 'step': 9467},\n",
       " {'loss': 0.22320395708084106, 'acc': 93.75, 'step': 9468},\n",
       " {'loss': 0.24877586960792542, 'acc': 90.625, 'step': 9469},\n",
       " {'loss': 0.2334049940109253, 'acc': 92.1875, 'step': 9470},\n",
       " {'loss': 0.17531217634677887, 'acc': 93.75, 'step': 9471},\n",
       " {'loss': 0.3911239206790924, 'acc': 90.625, 'step': 9472},\n",
       " {'loss': 0.270070344209671, 'acc': 89.0625, 'step': 9473},\n",
       " {'loss': 0.1437525600194931, 'acc': 93.75, 'step': 9474},\n",
       " {'loss': 0.2733078598976135, 'acc': 89.0625, 'step': 9475},\n",
       " {'loss': 0.2057996243238449, 'acc': 92.1875, 'step': 9476},\n",
       " {'loss': 0.22281043231487274, 'acc': 90.625, 'step': 9477},\n",
       " {'loss': 0.1983882188796997, 'acc': 95.3125, 'step': 9478},\n",
       " {'loss': 0.28579258918762207, 'acc': 87.5, 'step': 9479},\n",
       " {'loss': 0.18966691195964813, 'acc': 96.875, 'step': 9480},\n",
       " {'loss': 0.27394798398017883, 'acc': 89.0625, 'step': 9481},\n",
       " {'loss': 0.3847825527191162, 'acc': 89.0625, 'step': 9482},\n",
       " {'loss': 0.257118821144104, 'acc': 92.1875, 'step': 9483},\n",
       " {'loss': 0.1479347050189972, 'acc': 96.875, 'step': 9484},\n",
       " {'loss': 0.2144969254732132, 'acc': 90.625, 'step': 9485},\n",
       " {'loss': 0.14333879947662354, 'acc': 96.875, 'step': 9486},\n",
       " {'loss': 0.24070967733860016, 'acc': 92.1875, 'step': 9487},\n",
       " {'loss': 0.19414955377578735, 'acc': 93.75, 'step': 9488},\n",
       " {'loss': 0.2361435443162918, 'acc': 92.1875, 'step': 9489},\n",
       " {'loss': 0.2901403605937958, 'acc': 90.625, 'step': 9490},\n",
       " {'loss': 0.24944210052490234, 'acc': 90.625, 'step': 9491},\n",
       " {'loss': 0.2799053192138672, 'acc': 93.75, 'step': 9492},\n",
       " {'loss': 0.2366626113653183, 'acc': 93.75, 'step': 9493},\n",
       " {'loss': 0.2303202897310257, 'acc': 90.625, 'step': 9494},\n",
       " {'loss': 0.23005527257919312, 'acc': 92.1875, 'step': 9495},\n",
       " {'loss': 0.49472302198410034, 'acc': 85.9375, 'step': 9496},\n",
       " {'loss': 0.36328786611557007, 'acc': 89.0625, 'step': 9497},\n",
       " {'loss': 0.5259832143783569, 'acc': 90.625, 'step': 9498},\n",
       " {'loss': 0.14169174432754517, 'acc': 93.75, 'step': 9499}]"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history['train'][-100:-1]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.741226Z",
     "start_time": "2025-06-26T01:45:37.737721Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[{'loss': 2.660419792175293, 'acc': 8.68, 'step': 0},\n",
       " {'loss': 0.5110557450771331, 'acc': 82.06, 'step': 500},\n",
       " {'loss': 0.45784917736053465, 'acc': 84.34, 'step': 1000},\n",
       " {'loss': 0.43342011790275575, 'acc': 84.74, 'step': 1500},\n",
       " {'loss': 0.410778385591507, 'acc': 85.36, 'step': 2000},\n",
       " {'loss': 0.40443380892276765, 'acc': 85.72, 'step': 2500},\n",
       " {'loss': 0.38391841192245485, 'acc': 86.4, 'step': 3000},\n",
       " {'loss': 0.3810647835969925, 'acc': 86.66, 'step': 3500},\n",
       " {'loss': 0.3711730754852295, 'acc': 86.78, 'step': 4000},\n",
       " {'loss': 0.3722163967847824, 'acc': 86.5, 'step': 4500},\n",
       " {'loss': 0.3689910971164703, 'acc': 86.62, 'step': 5000},\n",
       " {'loss': 0.35920627954006196, 'acc': 87.34, 'step': 5500},\n",
       " {'loss': 0.35336609568595884, 'acc': 87.2, 'step': 6000},\n",
       " {'loss': 0.35695234858989716, 'acc': 87.28, 'step': 6500},\n",
       " {'loss': 0.3472429292678833, 'acc': 87.94, 'step': 7000},\n",
       " {'loss': 0.3485064945936203, 'acc': 87.56, 'step': 7500},\n",
       " {'loss': 0.34187562642097474, 'acc': 87.54, 'step': 8000},\n",
       " {'loss': 0.348040713429451, 'acc': 87.28, 'step': 8500},\n",
       " {'loss': 0.34649943730831145, 'acc': 87.46, 'step': 9000}]"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "history['val'][-1000:-1]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 绘制损失曲线和准确率曲线"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.744941Z",
     "start_time": "2025-06-26T01:45:37.741226Z"
    }
   },
   "outputs": [],
   "source": [
    "# 导入绘图库\n",
    "import matplotlib.pyplot as plt\n",
    "from matplotlib import font_manager\n",
    "def plot_learning_curves1(history):\n",
    "    # 设置中文字体支持\n",
    "    plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体\n",
    "    plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题\n",
    "\n",
    "    # 创建一个图形，包含两个子图（损失和准确率）\n",
    "    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 5))\n",
    "\n",
    "    # 绘制损失曲线\n",
    "    epochs = range(1, len(history['train_loss']) + 1)\n",
    "    ax1.plot(epochs, history['train_loss'], 'b-', label='训练损失')\n",
    "    ax1.plot(epochs, history['val_loss'], 'r-', label='验证损失')\n",
    "    ax1.set_title('训练与验证损失')\n",
    "    ax1.set_xlabel('轮次')\n",
    "    ax1.set_ylabel('损失')\n",
    "    ax1.legend()\n",
    "    ax1.grid(True)\n",
    "\n",
    "    # 绘制准确率曲线\n",
    "    ax2.plot(epochs, history['train_acc'], 'b-', label='训练准确率')\n",
    "    ax2.plot(epochs, history['val_acc'], 'r-', label='验证准确率')\n",
    "    ax2.set_title('训练与验证准确率')\n",
    "    ax2.set_xlabel('轮次')\n",
    "    ax2.set_ylabel('准确率 (%)')\n",
    "    ax2.legend()\n",
    "    ax2.grid(True)\n",
    "\n",
    "    plt.tight_layout()\n",
    "    plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.816716Z",
     "start_time": "2025-06-26T01:45:37.744941Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAzoAAAHACAYAAABqJx3iAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQAAinVJREFUeJzt3Qd4U+X3B/Bv2qR70dJC2XvvIRtRliAI4hYUFdyoiOuPA8XFz70FJ4iKigNciCDK3nvvQhll0910JPk/571JaaErbdKs7+d5Lrm5zbhtQ+8995z3vDqLxWIBERERERGRF/Fz9Q4QERERERE5GgMdIiIiIiLyOgx0iIiIiIjI6zDQISIiIiIir8NAh4iIiIiIvA4DHSIiIiIi8joMdIiIiIiIyOsw0CEiIiIiIq+jhwcwm804fvw4wsPDodPpXL07REQ+Q+aUTktLQ40aNeDnx2tjNjwuERG5/7HJIwIdOZjUrl3b1btBROSzjhw5glq1arl6N9wGj0tERO5/bPKIQEeumNm+mYiICLufn5ubiwULFmDAgAEwGAxO2EOi8uPnk9xZamqqOqG3/R0mDY9L5O34GSVvODZ5RKBjKwuQg0l5DyghISHqufzPSu6Gn0/yBCzPKozHJfJ2/IySNxybWHBNREREREReh4EOERERERF5HQY6RERERETkdTxijA4RuW97x7y8PJhMJlfvCpWTv78/9Ho9x+AQEZHXYaBDROWSk5ODpKQkZGZmunpXqIJkwHF8fDwCAgJcvStEREQOw0CHiMo1WWJCQoLKBshkXXKCzIyAZ2bkJGA9ffq0+n02btyYk4ISEZHXYKBDRHaTk2MJdqSHvWQDyHMFBwer1rGHDx9Wv9egoCBX7xIREZFD8NIdEZUbr/57B/4eiYjIG/HoRkREREREXoeBDhEREREReR0GOkRE5VSvXj28++67DnmtxYsXq4YOycnJDnk9IiIiX8dmBETkU/r06YN27do5JEBZt24dQkNDHbJfRERE5FgMdIiILmq5LBOgyiSapYmNja2UfSIiIiL7eX3p2vJ9Z3DNR6vwzT6v/1aJXBocZObkuWSR9y6rO+64A0uWLMF7772nysRkmTFjhrr966+/0LFjRwQGBmL58uU4cOAAhg0bhmrVqiEsLAydO3fGP//8U2LpmrzO559/jmuvvVa13ZZ5aX777bdy/1x//vlntGzZUu2TvNdbb71V6Osff/yxeg9pCS37ef311+d/7aeffkLr1q1V++iYmBj069cPGRkZ5d4XIiKilMxcPPDtBny8eD88gddndLLzTNh1Ig11QjmZIZGzZOWa0GLS3y55750vDkRIQNn+lEmAs3fvXrRq1Qovvvii2rZjxw51+3//939488030aBBA1SpUgVHjhzB4MGD8corr6hAY+bMmRg6dCj27NmDOnXqFPsekydPxuuvv4433ngDH3zwAUaOHKnmqImOjrbr+9qwYQNuvPFGvPDCC7jpppuwcuVKPPDAAypokYBt/fr1ePjhh/H111+je/fuOHfuHJYtW6aem5SUhFtuuUXthwRdaWlp6mv2BIVEREQFGXNNuHvmeqw9dA7zt5/AkNY1UCfGvefS8/pAJzRQ+xaNJlfvCRG5WmRkJAICAlS2pXr16mrb7t271a0EPv37989/rAQmbdu2zb//0ksvYc6cOSpDM27cuGLfQ4IQCTLEq6++ivfffx9r167FVVddZde+vv322+jbty+ee+45db9JkybYuXOnCqDkPRITE9X4oCFDhiA8PBx169ZF+/bt8wOdvLw8jBgxQm0Xkt0hIiIqD5PZggmzN6sgR5gtwPSVCXh+aEu4M68PdMKsgU42Ax0ipwk2+KvMiqve2xE6depU6H56errKpvz555/5gUNWVpYKMErSpk2b/HUJRCIiInDq1Cm792fXrl2qdK6gHj16qFI5GUMkQZkEMZKBkiBKFlvJnARoEiRJcDNw4EAMGDBAlbVJpoqIiMgeUg3w0h87MW/bCQT4++Ge3g3w4X/7MXvdETzavwkiggxwV36+EugYza7eEyLvJWNTpHzMFYu8tyNc3D3t8ccfVxkcycpI2dfmzZtV4JCTk1Pi6xgMhf/gy/6ZzY7/AyRZnI0bN+K7775DfHw8Jk2apAIcaU/t7++PhQsXqnFHLVq0UCV0TZs2RUJCgsP3g4iIvNunSw9ixspDav3tm9risQFN0KRaGDJyTPhh7RG4M+8PdIJsGR052WB9OpGvk9I1yYiUZsWKFapETLIkEuBIqduhQ9of+srQvHlztQ8X75OUsEkgI6QznDQZkLE4W7duVfv377//5gdYkgGSMUObNm1S37cEbkRERGU1d9MxTPlLK/F+9urmGNKmhjq+jO3ZQG2bviIBeSb3zSb4TOma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9eqF7du3Izw8XD2Gn08i78JjE7k7HpvIm3lNoFNWjz76KAIDA7F69eoSU7NEjjZo0KD8dbkSJgeXunXrYvbs2RgzZozazs8nkW/i/31yFR6byJt5Tema/Mfz9/fHyZMnC22X+1JvatO/f38cO3YMf//9twv2kuiCqKgoNGnSBPv378/fxs8nkXfhsYk8DY9N5E28JtAJCAhAx44dsWjRovxtZrNZ3e/WrVv+tmuuuQazZs3C2LFj8f3337tob4mA9PR0HDhwQA3qtOHnk8i78NhEnobHJvImXlW6Ju07R48ejU6dOuGyyy7Du+++i4yMDNXppqBrr70WX3/9NW677TbVaeT666932T6T73j88ccxdOhQVRJw/Phx1blGrvTecssthR7HzyeRd+GxidwZj03kzbwq0Lnppptw+vRpTJo0CSdOnEC7du0wf/78SwaBCvkPKlfV5D+sdMAZMWKES/aZfMfRo0fVgePs2bOIjY1Fz549Vb2zrF+Mn08i78FjE7kzHpvIm+ks0i+QiIiIiIjIi3jNGB0iIiIiIiIbBjpEREREROR1GOgQEREREZHXYaBDREREREReh4EOERERERF5HQY6RERERETkdRjoEBERERGR12GgQ0REREREXoeBDpGD3HHHHRg+fLird4OIiEjhcYl8HQMdIiIiIiLyOgx0iOz0008/oXXr1ggODkZMTAz69euHJ554Al999RV+/fVX6HQ6tSxevFg9/siRI7jxxhsRFRWF6OhoDBs2DIcOHbrkitvkyZMRGxuLiIgI3HfffcjJyXHhd0lERJ6CxyWioumL2U5ERUhKSsItt9yC119/Hddeey3S0tKwbNky3H777UhMTERqaiqmT5+uHisHj9zcXAwcOBDdunVTj9Pr9Xj55Zdx1VVXYevWrQgICFCPXbRoEYKCgtRBSA42d955pzpYvfLKKy7+jomIyJ3xuERUPAY6RHYeUPLy8jBixAjUrVtXbZOraEKupGVnZ6N69er5j//mm29gNpvx+eefq6tpQg44chVNDh4DBgxQ2+TA8uWXXyIkJAQtW7bEiy++qK7GvfTSS/DzY+KViIiKxuMSUfH4SSWyQ9u2bdG3b191ELnhhhvw2Wef4fz588U+fsuWLdi/fz/Cw8MRFhamFrmiZjQaceDAgUKvKwcTG7nSlp6ersoLiIiIisPjElHxmNEhsoO/vz8WLlyIlStXYsGCBfjggw/wzDPPYM2aNUU+Xg4KHTt2xLfffnvJ16TumYiIqCJ4XCIqHgMdIjtJqr9Hjx5qmTRpkioVmDNnjkrzm0ymQo/t0KEDfvjhB8TFxanBnCVdYcvKylJlBmL16tXqKlvt2rWd/v0QEZFn43GJqGgsXSOyg1whe/XVV7F+/Xo1yPOXX37B6dOn0bx5c9SrV08N5NyzZw/OnDmjBnyOHDkSVatWVR1tZNBnQkKCqoF++OGHcfTo0fzXlU42Y8aMwc6dOzFv3jw8//zzGDduHOugiYioRDwuERWPGR0iO8jVr6VLl+Ldd99VnWzkqtlbb72FQYMGoVOnTupgIbdSGvDff/+hT58+6vFPPfWUGigq3XBq1qyp6qkLXkmT+40bN0bv3r3VwFHpoPPCCy+49HslIiL3x+MSUfF0FovFUsLXicjJZL6C5ORkzJ0719W7QkRExOMSeQ3mH4mIiIiIyOsw0CEiIiIiIq/D0jUiIiIiIvI6zOgQEREREZHXYaBDREREREReh4EOERERERF5HQY6RERERETkdRjoEBERERGR12GgQ0REREREXoeBDhEREREReR0GOkRERERE5HUY6BAREREREbzN/wN9/niYWpR0IQAAAABJRU5ErkJggg==",
      "text/plain": [
       "<Figure size 1000x500 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_learning_curves(history, sample_step=500)  #横坐标是 steps"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:45:37.818553Z",
     "start_time": "2025-06-26T01:45:37.816716Z"
    }
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T01:48:40.300725Z",
     "start_time": "2025-06-26T01:48:39.548524Z"
    }
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(87.14, 0.35521284489631655)"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 在测试集上评估模型\n",
    "test_accuracy = evaluate_model(model, test_loader, device, loss_fn)\n",
    "test_accuracy\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
